import { Context } from 'egg';
import utils from "~/utils";
import ErrorCodeConstant from "~/constants/error_code";

/**
 * 防止表单重复提交
 */
export default function rateLimitRepeatMiddleWare(): any {
    return async (ctx: Context, next: () => Promise<any>) => {

        if (ctx.request.method === 'POST') {
            // 生成一个唯一请求标识
            const buffer = Buffer.from(ctx.ip + ctx.request.url + JSON.stringify(ctx.request.body));
            let key = 'rate_limit:' + buffer.toString('hex');

            // 判断 redis 缓存中是否存在 如果存在 返回重复提交
            if (await ctx.app.redis.exists(key)) {
                ctx.body = utils.resp.fail(ErrorCodeConstant.getDesc(ErrorCodeConstant.RATE_LIMIT), ErrorCodeConstant.RATE_LIMIT);
                return false;
            }

            // 不存在，则记录至 redis 缓存中 3s, 3s后过期
            // let data = { id: ctx.getUserInfo().id };
            let data = { id: '123', request: ctx.request.body };
            await ctx.app.redis.set(key, JSON.stringify(data), 'EX', 3);
        }

        await next();
    };
};